/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Conexao;

import Entidade.HistoricoSistema;
import java.util.Date;
import org.hibernate.Session;

/**
 *
 * @author francis.almeida
 */
public class Persistir {
    
      
    Date data = new Date();
    
    
         /**
     * Metodo que recebe uma instancia de uma entidade com seu atributos para SALVAR no banco de dados
     * @param entidade
     * @throws Exception 
     */
    public void Salvar(Object entidade) throws Exception {
        Session session = HibernateUtil.getSession();
        boolean roolBack = false;   
        try {
            session.beginTransaction();
            session.save(entidade);
            session.getTransaction().commit();
        } catch (Exception ex){
            session.getTransaction().rollback();
            roolBack = true;
            throw ex;
        } finally {
            session.close();
            
            try {
                GravarHistorioSistema(entidade, "Gravar", roolBack);
            } catch (Exception e)
            { }
        }

    }

 /**
  * Metodo que recebe uma instancia de uma entidade com seu atributos para ATUALIZAR no banco de dados
  * @param entidade
  * @throws Exception 
  */
     public void Atualizar(Object entidade) throws Exception {
       Session session = HibernateUtil.getSession();
       boolean roolBack = false;   
        try {
            session.beginTransaction();
            session.update(entidade);
            session.getTransaction().commit();
        } catch (Exception ex){
            session.getTransaction().rollback();
            roolBack = true;
            throw ex;
        } finally {
            session.close();
            try {
                GravarHistorioSistema(entidade, "Atualizar", roolBack);
            } catch (Exception e) {
            }
            
        }
    }

     
    /**
  * Metodo que recebe uma instancia de uma entidade para DELETAR do banco de dados
  * @param entidade
  * @throws Exception 
  */  
   public void Deletar(Object entidade) throws Exception {
        Session session = HibernateUtil.getSession();
        boolean roolBack = false;        
        try {
            session.beginTransaction();
            session.delete(entidade);
            session.getTransaction().commit();
        } catch (Exception ex){
            session.getTransaction().rollback();
            roolBack = true;
            throw ex;
        } finally {
            session.close();
            
            try {
                GravarHistorioSistema(entidade, "Deletar", roolBack);
            } catch (Exception e) {
            }
        }
    }
   
   /**Metodo para gravar um historico de todas as vezes que foi chamado o metodo Gravar, Atualizar e Deletar */
   private void GravarHistorioSistema(Object entidade, String descricao, boolean roolBack)throws Exception
   {
       
       HistoricoSistema historico = new HistoricoSistema();
       String desc;
       String back = roolBack == true ? " - * Fez RoolBack * " : "";
       
       if(descricao.equals("Gravar"))
       {
           desc = "Novo registro" + back;
       }
       else if(descricao.equals("Atualizar"))
       {
          desc = "Alterado registro" + back;
       }
       else
       {
           desc = "Excluido registro" + back;   
       }
       
       historico.setDescricao(desc);
       //historico.setEntidade("Usuário: " + BaseCore.GetUsuarioLogado().getNome() + " - Objeto: " + entidade.toString() + " - Local: " + ((Object)entidade).getClass());
       historico.setEntidade("Objeto: " + entidade.toString() + " - Local: " + ((Object)entidade).getClass());
       historico.setDataHora(data);
       
       Session session = HibernateUtil.getSession();
        try {
            session.beginTransaction();
            session.save(historico);
            session.getTransaction().commit();
        } catch (Exception ex){
            session.getTransaction().rollback();
            throw ex;
        } finally {
            session.close();
        }
   }
    
    
}
